package com.dynabook.ebs.utils;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 日志工具类
 * @author dynabook
 */
@Slf4j
public class LogUtils {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final Logger DEFAULT_LOGGER = LoggerFactory.getLogger(LogUtils.class);

    /**
     * 记录信息日志
     * @param logger 日志记录器
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void info(Logger logger, String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 1];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        logger.info("[{}] " + message, newArgs);
    }
    
    /**
     * 记录信息日志（支持任何类型的Logger）
     * @param obj 任何对象
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void info(Object obj, String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        String formattedMessage = formatMessage(timestamp, message, args);
        System.out.println(formattedMessage);
        
        // 使用默认日志记录器记录
        DEFAULT_LOGGER.info("[{}] " + message, timestamp, args);
    }
    
    /**
     * 记录信息日志（使用默认日志记录器）
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void info(String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 1];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        DEFAULT_LOGGER.info("[{}] " + message, newArgs);
    }

    /**
     * 记录错误日志
     * @param logger 日志记录器
     * @param message 日志消息
     * @param e 异常
     * @param args 日志参数
     */
    public static void error(Logger logger, String message, Throwable e, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 2];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        newArgs[newArgs.length - 1] = e;
        logger.error("[{}] " + message, newArgs);
    }
    
    /**
     * 记录错误日志（支持任何类型的Logger）
     * @param obj 任何对象
     * @param message 日志消息
     * @param e 异常
     * @param args 日志参数
     */
    public static void error(Object obj, String message, Throwable e, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        String formattedMessage = formatMessage(timestamp, message, args);
        System.err.println(formattedMessage);
        System.err.println(e.getMessage());
        
        // 使用默认日志记录器记录
        DEFAULT_LOGGER.error("[{}] " + message, timestamp, args, e);
    }
    
    /**
     * 记录错误日志（使用默认日志记录器）
     * @param message 日志消息
     * @param e 异常
     * @param args 日志参数
     */
    public static void error(String message, Throwable e, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 2];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        newArgs[newArgs.length - 1] = e;
        DEFAULT_LOGGER.error("[{}] " + message, newArgs);
    }

    /**
     * 记录警告日志
     * @param logger 日志记录器
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void warn(Logger logger, String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 1];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        logger.warn("[{}] " + message, newArgs);
    }
    
    /**
     * 记录警告日志（支持任何类型的Logger）
     * @param obj 任何对象
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void warn(Object obj, String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        String formattedMessage = formatMessage(timestamp, message, args);
        System.out.println(formattedMessage);
        
        // 使用默认日志记录器记录
        DEFAULT_LOGGER.warn("[{}] " + message, timestamp, args);
    }
    
    /**
     * 记录警告日志（使用默认日志记录器）
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void warn(String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 1];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        DEFAULT_LOGGER.warn("[{}] " + message, newArgs);
    }

    /**
     * 记录调试日志
     * @param logger 日志记录器
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void debug(Logger logger, String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 1];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        logger.debug("[{}] " + message, newArgs);
    }
    
    /**
     * 记录调试日志（支持任何类型的Logger）
     * @param obj 任何对象
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void debug(Object obj, String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        String formattedMessage = formatMessage(timestamp, message, args);
        System.out.println(formattedMessage);
        
        // 使用默认日志记录器记录
        DEFAULT_LOGGER.debug("[{}] " + message, timestamp, args);
    }
    
    /**
     * 记录调试日志（使用默认日志记录器）
     * @param message 日志消息
     * @param args 日志参数
     */
    public static void debug(String message, Object... args) {
        String timestamp = LocalDateTime.now().format(FORMATTER);
        Object[] newArgs = new Object[args.length + 1];
        newArgs[0] = timestamp;
        System.arraycopy(args, 0, newArgs, 1, args.length);
        DEFAULT_LOGGER.debug("[{}] " + message, newArgs);
    }
    
    /**
     * 获取指定类的日志记录器
     * @param clazz 类
     * @return 日志记录器
     */
    public static Logger getLogger(Class<?> clazz) {
        return LoggerFactory.getLogger(clazz);
    }
    
    /**
     * 格式化日志消息
     * @param timestamp 时间戳
     * @param message 日志消息
     * @param args 日志参数
     * @return 格式化后的消息
     */
    private static String formatMessage(String timestamp, String message, Object... args) {
        String result = "[" + timestamp + "] " + message;
        if (args != null && args.length > 0) {
            for (Object arg : args) {
                result = result.replaceFirst("\\{\\}", arg != null ? arg.toString() : "null");
            }
        }
        return result;
    }
} 